<?php
/**
 * Created by PhpStorm. User: ADun, Date: 14-10-27 下午10:57
 * Description:
 */

if(!defined('_LHDir')) define('_LHDir',__DIR__ . DIRECTORY_SEPARATOR);

include_once _LHDir.'config.inc.php';
include_once _LHDir.'constants.php';
include_once _LHDir.'tools/tools.common.php';

include_once _LHDir.'linhePDO.php';
include_once _LHDir.'DataObject.php';

include_once _LHDir.'system.XinxiZhongxin.php';
include_once _LHDir.'hermes.BusinessObject.php';

include_once _LHDir.'interface.ToWeixin.php';
include_once _LHDir.'system.MsgRouter.php';
include_once _LHDir.'system.InnerBusiness.php';
include_once _LHDir.'system.ReturnStack.php';

include_once _LHDir.'Base.php';
include_once _LHDir.'bs/bs.php';
include_once _LHDir.'bs/bs.publicnumber.php';
include_once _LHDir.'bs/bs.User.php';
include_once _LHDir.'bs/bs.User.Seller.php';
include_once _LHDir.'bs/bs.QRCode.php';
include_once _LHDir.'bs/bs.message.php';
include_once _LHDir.'Interface.Weixin.php';


set_error_handler('error_handler',E_ALL);
register_shutdown_function('shutdown_function');
date_default_timezone_set('Asia/Chongqing');

function 邻和(){
    return Linhe::getInstance();
}
//wdz()方法, 邻和()方法别名
function wzd(){
    return 邻和();
}
//返回系统中的静态类, 赋值给变量后可以调用其静态方法

class Linhe{

    public  $serv_id=G_SERV_ID; //当前的公众号系统id


    public $vc微直达;
    /**
     * @var C微信
     */
    public $vc公众号;
    /**
     * @var C用户
     */
    public $vc当前用户;
    /**
     * @var C聊天
     */
    public $vc当前会话;

    public $vc信息中心;

    public $vo当前聊天;

    private static $vo信息中心静态实例;


    public static function getInstance(){
        static $instance;
        if(empty($instance)) $instance=new Linhe();
        return $instance;
    }

    /**
     * 根据公众号OpenID获得当前公众号的系统编号
     * @param $vs公众号open
     * @return int
     */
    public function getServId($vs公众号open){
        //TODO 需要完善
        $do公众号 = new DoPublic_serv_accounts();
        $do公众号->set_公众号openID($vs公众号open);
        $do公众号->loadByKeys($do公众号->data);
        $vi公众号Id= $do公众号->get_id();


        $this->serv_id=$vi公众号Id;
        if($vs公众号open)
            return $vi公众号Id;
        else
            return G_SERV_ID;
    }

    /**
     * @param $openId
     * @param C信息中心 $vo中心
     * @param DoMessage $vo当前消息
     * @return bool|C用户
     */
    public  function init当前用户(C信息中心 $vo中心){

        if(empty($this->vc当前用户)) $this->vc当前用户 = C用户::initByParent($vo中心);

        if($this->vc当前用户->vo用户数据)
            return $this->vc当前用户;
        else
            return false;
    }
    public  function init微直达(C信息中心 $vo中心){
        if(empty($this->vc微直达)) $this->vc微直达 = new C微直达( $vo中心);

       return $this->vc微直达;
    }
    public function new用户($openId,C信息中心 $vo中心,$vo当前消息){
        return $this->vc当前用户= new C用户($openId, $vo中心,$vo当前消息);
    }
    public function f用户_是否注册($userOpenId){
        return C用户::f是否注册($userOpenId);
    }

    public function f微信_验证签名($signature,$timestamp,$nonce,$appid){
        return C微信::f验证签名($signature,$timestamp,$nonce,$appid);
    }

    /**
     * @param string $vs公众号openId
     * @param string $vs用户OpenId
     * @param int $vs通道
     * @return C信息中心
     */
    public function get信息中心(){
        if(!empty($vo信息中心静态实例))
        {            logger()->logInfo('linhe获取信息中心成功！');

            return $vo信息中心静态实例;}
        else {            logger()->logInfo('linhe获取信息中心失败！');

            return false;}
    }


    /**
     * @param C微信 $微信
     * @return \C微信
     */
    public function init微信接口($userOpenId,$gzdOpenId,C信息中心 $vo信息中心)
    {
        $this->vc公众号 = new C微信($userOpenId,$gzdOpenId, $vo信息中心 );
        return $this->vc公众号;
    }

    public function f关键字_用户默认关键字($vi用户id){
        return C关键字::f获得用户默认关键字($vi用户id);
    }

    public function f二维码_所属用户($vi二维码编号,$permanent=true){
        return C二维码::f二维码所属用户($vi二维码编号,$permanent);
    }

    public  function 二维码(){
        static $instance;
        if(empty($instance)) $instance=new C二维码();
        return $instance;
    }

    public  function 关键字(){
        static $instance;
        if(empty($instance)) $instance=new C关键字();
        return $instance;
    }


    public  function 用户财务(){
            static $instance;
            if(empty($instance)) $instance=new C用户财务();
            return $instance;
    }

    public  function LinhePDO(){
        static $p;
        if(empty($p)) {
            $p = new LinhePDO();
        }
        return $p;
    }


    public static function Tools(){
        static $instance;
        if(!isset($instance)) $instance=new Tools();
        return $instance;
    }

    public static function Test(){
        //$bs=new BusinessManager();
        return 'test';
    }

}


function pdo_new(){
    return 邻和()->LinhePDO();
}
function error_handler ($error_level, $error_message, $file, $line) {


    $EXIT = FALSE;
    switch ($error_level) {
        //提醒级别
        case E_NOTICE:
        case E_USER_NOTICE:
            $error_type = 'Notice';
            break;
        //警告级别
        case E_WARNING:
        case E_USER_WARNING:
            $error_type = 'Warning';
            break;
        //错误级别
        case E_ERROR:
        case E_USER_ERROR:
            $error_type = 'Fatal Error';
            $EXIT = TRUE;
            break;
        //其他未知错误
        default:
            $error_type = 'Unknown';
            $EXIT = TRUE;
            break;

    }

    //直接打印错误信息， 也可以写文件， 写数据库， 反正错误信息都在这， 任你发落

    $htmInfo= sprintf ("<font color='#ff0000'><b>%s</b></font>: %s in <b>%s</b> on line <b>%d</b><br /><br />\n", $error_type, $error_message, $file, $line);
    $txtInfo=sprintf ("█ %s: %s in %s on line %d\n", $error_type, $error_message, $file, $line);


        logger()->logError($txtInfo);

    //错误影响到程序的正常执行的话跳转到友好的错误提示页面

    if (TRUE == $EXIT) {

        echo $txtInfo;
        if(邻和()->vc公众号)
            邻和()->vc公众号->fh生成文本消息('System Error! Please contact provider.');

    }
}


function shutdown_function()
{
    $e = error_get_last();
    if($e)
        logger()->logError('███'.var_export($e,true));

}